\section{Geração de Código}

Nessa seção detalharemos os mapeamentos realizados no projeto apresentando os
esqueletos de código que foram adicionados ao arquivo \texttt{.cup}.

No Exemplo~\ref{lst:if} vemos um exemplo de entrada contendo um comando
condicional \texttt{if} e sua respectiva geração de código a partir do
compilador no Exemplo~\ref{fig:ifA}.

\begin{lstlisting}[frame=single,
caption={if-then-else em PHP},label=lst:if,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
<?php
$a = 1;
if ($a >= 2) {
    $a = 2;
} elseif ($a == 5) {
    $a = 3;
} else {
    $a = 4;
}
?>
\end{lstlisting}


\begin{lstlisting}[frame=single,
caption={if-then-else traduzido para Assembly},label=lst:ifA,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}] 
LD R1, #1
ST a, R1

LD R1, a
LD R2, #2
JGE L1, R1, R2
ST R1, #0
JMP L2
L1: ST R1, #1
L2:
JZ L0, R1
LD R3, #2
ST a, R3
JMP L3
L0: LD R3, a
LD R4, #5
SUB R3, R3, R4
JNZ L4, R3
ST R3, #1
JMP L5
L4: ST R3, #0
L5:
JZ L6, R3
LD R4, #3
ST a, R4
JMP L3
L6: LD R4, #4
ST a, R4
L3:
\end{lstlisting}

Para a tradução do \texttt{switch}, temos os Exemplos ~\ref{lst:switch} e
~\ref{lst:switchA}

\begin{lstlisting}[frame=single,
caption={switch em PHP},label=lst:switch,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
<?php
$a = 1;
switch ($a) {
    case 1: $b = 1; break;
    case 2: $b = 3;
}
?>
\end{lstlisting}

\begin{lstlisting}[frame=single,
caption={switch traduzido para Assembly},label=lst:switchA,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
LD R1, R1
ST a, R1

LD R1, a
LD R2, #1
SUB R2, R1, R2
JNZ L1, R2
LD R3, #1
ST b, R3

JMP L0
L1: LD R3, #2
SUB R3, R1, R3
LD R4, #3
ST b, R4

L0: 
\end{lstlisting}

O \texttt{switch} também pode ser usado com \texttt{default}, que é executado
caso nenhuma condição satisfaça a expressão avaliada.

\begin{lstlisting}[frame=single,
caption={switch com default em PHP},label=lst:switchDefault,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
<?php
$a = 1;
switch ($a) {
    case 1: $b = 1; break;
    case 2: $b = 3;
    default: $b = 4;
}
?>
\end{lstlisting}


\begin{lstlisting}[frame=single,
caption={switch com default em Assembly},label=lst:switchDefaultA,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
LD R1, #1
ST a, R1

LD R1, a
LD R2, #1
SUB R2, R1, R2
JNZ L1, R2
LD R3, #1
ST b, R3

JMP L0
L1: LD R3, #2
SUB R3, R1, R3
JNZ L2, R3
LD R4, #3
ST b, R4

L2:
LD R4, #4
ST b, R4

L0:
\end{lstlisting}

Nos Exemplos~\ref{lst:while} e ~\ref{lst:whileA}, vemos o mapeamento do
\texttt{while} em PHP para Assembly.

\begin{lstlisting}[frame=single,
caption={while em PHP},label=lst:while,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
<?php
$a = 1;
while ($a < 20) {
	$a++;
}
$a = 20;
?>
\end{lstlisting}

\begin{lstlisting}[frame=single,
caption={while traduzido para Assembly},label=lst:whileA,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}] 
LD R1, #1
ST a, R1

L0: LD R1, a
LD R2, #20
JL L2, R1, R2
ST R1, #0
JMP L3
L2: ST R1, #1
L3:
JZ L1, R1
LD R3, a
INC R3, R3
ST a, R3
JMP L0
L1:

LD R3, #20
ST a, R3
\end{lstlisting}

O \texttt{while} em PHP também pode ser feito com o uso de \texttt{do}, cujo
exemplo de mapeamento são apresentados nos Exemplos ~\ref{lst:whileDo} e
~\ref{lst:whileDoA}.

\begin{lstlisting}[frame=single,
caption={do-while em PHP},label=lst:whileDo,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
<?php
$a = 1;
do {
	$a++;
} while ($a < 20);
?>
\end{lstlisting}

\begin{lstlisting}[frame=single,
caption={do-while traduzido para Assembly},label=lst:whileDoA,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
LD R1, #1
ST a, R1

L0: LD R1, a
INC R1, R1
ST a, R1
LD R1, a
LD R2, #20
JL L1, R1, R2
ST R1, #0
JMP L2
L1: ST R1, #1
L2:
JNZ L0, R1
\end{lstlisting}

Podemos também mostrar o uso de um \texttt{do-while} com \texttt{continue}
gerado para Assembly nos Exemplos ~\ref{lst:whileC} e ~\ref{lst:whileCA}.

\begin{lstlisting}[frame=single,
caption={do-while com continue em PHP},label=lst:whileC,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
<?php
$a = 1;
do {
	$a++;
	continue;
	$b = 4;
} while ($a < 20);
?>
\end{lstlisting}

\begin{lstlisting}[frame=single,
caption={do-while com continue traduzido para Assembly},label=lst:whileCA,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
LD R1, #1
ST a, R1

L0: LD R1, a
INC R1, R1
ST a, R1
JMP L1
LD R1, #4
ST b, R1
L1: LD R1, a
LD R2, #20
JL L3, R1, R2
ST R1, #0
JMP L4
L3: ST R1, #1
L4:
JNZ L0, R1
L2:
\end{lstlisting}

Nos Exemplos ~\ref{lst:for} e ~\ref{lst:forA} temos a entrada e geração para um
\texttt{for}.

\begin{lstlisting}[frame=single,
caption={for em PHP},label=lst:for,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
<?php
for($i = 0; $i < 10; $i++) {
	$a = 1;
}
$a = 5;
?>
\end{lstlisting}

\begin{lstlisting}[frame=single,
caption={for traduzido para Assembly},label=lst:forA,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
LD R1, #0
ST i, R1
L0: LD R1, i
LD R2, #10
JL L4, R1, R2
ST R1, #0
JMP L5
L4: ST R1, #1
L5:
JNZ L1, R1
JMP L3
L1: LD R3, #1
ST a, R3
L2: LD R3, i
INC R3, R3
ST i, R3
JMP L0
L3:

LD R3, #5
ST a, R3
\end{lstlisting}

Para a declaração/chamada de função, mostramos os exemplos ~\ref{lst:func} e
~\ref{lst:funcA}

\begin{lstlisting}[frame=single,
caption={Função em PHP},label=lst:func,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
<?php

$c = 3;
abc(1,$c,3);

function abc($a, $b) {
	$a = 1;
	return;
}
?>
\end{lstlisting}

\begin{lstlisting}[frame=single,
caption={Função mapeada para Assembly},label=lst:funcA,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
abc PROC a, b
LD R1, #1
ST a, R1
RET
abc ENDP

LD R1, #3
ST c, R1

LD R2, #1
LD R3, c
LD R4, #3
PUSH R2
PUSH R3
PUSH R4
CALL abc
POP R4
POP R3
POP R2
\end{lstlisting}


\subsection{Árvore de derivação}

Para esclarecer melhor o funcionamento da gramática de PHP, resolvemos ilustrar
um exemplo de geração da árvore de derivação na Figura ~\ref{fig:grafo}.

  \begin{figure}[H] 
  \begin{center}
  \leavevmode
  \scalebox{0.3}{
  \includegraphics{img/grafoDaArvore.png}}
  \caption{Árvore de derivação}
  \label{fig:grafo} 
  \end{center}
  \end{figure}

Essa é a árvore gerada para a entrada vista em ~\ref{lst:exemploArvore}.

\begin{lstlisting}[frame=single,
caption={Código de Exemplo para a Árvore de Derivação},label=lst:exemploArvore,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
<?php
$a = 1 * 3 + 1
?>
\end{lstlisting}